#include <stdio.h>  // 标准输入输出
#include <stdlib.h> // 标准函数库
#include <string.h> // 字符串处理(操作字符数组)
#include <stdint.h>


#include "cmsis_os2.h"
#include "unistd.h"
#include "ohos_init.h"

#include "mpu6050.h"
#include "temp-humi.h"
#include "waterlevel.h"
#include "water.h"
#include "gps.h"
#undef STATIC  // 临时取消STATIC宏定义，避免与枚举冲突
#include "wifi_connecter.h"
#include "mqtt_task.h"

#include "hi_io.h"   //上拉、复用
#include "hi_gpio.h" //hi_gpio_set_dir()、hi_gpio_set(get)_output(input)_val()
#include "iot_gpio.h"//gpioInit
#include "hi_time.h"
#include "hi_i2c.h"


// // 定义一系列宏，用于标识SSID、密码、加密方式等，请根据实际情况修改
// #define PARAM_HOTSPOT_SSID "ZTE_7293A5"           // AP名称
// #define PARAM_HOTSPOT_PSK "1234567890"      // AP密码
// #define PARAM_HOTSPOT_TYPE WIFI_SEC_TYPE_PSK // 安全类型，定义在wifi_device_config.h中

// 定义一系列宏，用于标识SSID、密码、加密方式等，请根据实际情况修改
#define PARAM_HOTSPOT_SSID "jit-OpenAtom"           // AP名称
#define PARAM_HOTSPOT_PSK "jitopenatom"      // AP密码
#define PARAM_HOTSPOT_TYPE WIFI_SEC_TYPE_PSK // 安全类型，定义在wifi_device_config.h中


// 平台接入地址
#define PARAM_SERVER_ADDR "mqtt.xinmiao.net.cn"

// 端口号，MQTT协议对应的是1883
#define PARAM_SERVER_PORT "1883"

// 客户端ID
#define PARAM_CLIENT_ID "smartroom_act"

// 用户名
#define PARAM_USER_NAME "mqtttest"

// 密码
#define PARAM_PASSWORD "mqtttest"

// 主线程函数
static void pet_demo(void *arg)
{
    (void)arg;


    // 连接AP
    WifiDeviceConfig config = {0};                      // 定义热点配置
    strcpy(config.ssid, PARAM_HOTSPOT_SSID);            // 设置热点配置中的SSID
    strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK);     // 设置热点配置中的密码
    config.securityType = PARAM_HOTSPOT_TYPE;           // 设置热点配置中的加密方式
    osDelay(10);
    int netId = ConnectToHotspot(&config);              // 连接到热点
    if (netId < 0)                                      // 检查是否成功连接到热点
    {
        printf("Connect to AP failed!\r\n");
        return;
    }

    // 初始化并启动MQTT任务，连接MQTT服务器
    MqttTaskInit();                                                     // 初始化并启动MQTT任务
    const char *host = PARAM_SERVER_ADDR;                               // MQTT服务器IP地址
    unsigned short port = atoi(PARAM_SERVER_PORT);                      // MQTT服务器端口
    const char *clientId = PARAM_CLIENT_ID;                             // MQTT客户端ID
    const char *username = PARAM_USER_NAME;                             // MQTT服务器用户名
    const char *password = PARAM_PASSWORD;                              // MQTT服务器密码
    if (MqttTaskConnect(host, port, clientId, username, password) != 0) // 连接MQTT服务器
    {
        printf("Connect to MQTT server failed!\r\n");
        return;
    }

    // 订阅主题
    char *stopic = "pet/control";                                                         // 主题
    int rc = MqttTaskSubscribe(stopic);                                                 // 订阅主题
    if (rc != 0)                                                                        // 检查是否成功订阅主题
    {
        printf("MQTT Subscribe failed!\r\n");
        return;
    }
    printf("MQTT Subscribe OK\r\n");


    char *ptopic_ht = "pet/report/temp-humi";//主题
    char *ptopic_waterlevel = "pet/report/waterlevel";//主题
    char *ptopic_mpu6050 = "pet/report/mpu6050";//主题
    char *ptopic_gps = "pet/report/gps";

    IoTGpioInit(HI_GPIO_IDX_1);
    IoTGpioInit(HI_GPIO_IDX_0);

    hi_io_set_func(HI_IO_NAME_GPIO_0,HI_IO_FUNC_GPIO_0_I2C1_SDA);
    hi_io_set_func(HI_IO_NAME_GPIO_1, HI_IO_FUNC_GPIO_1_I2C1_SCL);
    hi_i2c_init(HI_I2C_IDX_1, MPU_I2C_BAUDRATE);

    //InitTempHumiSensor();
    MPU_Init();
    // GPSInit();
    
    
    while (1)
    {
        // //温湿度
        // char payload_th[512] = {0};                            // 消息内容
        // float temperature = 0.0f;                           // 温度
        // float humidity = 0.0f;                              // 湿度
        // if (GetTempHumiLevel(&temperature, &humidity) == 0) //成功获取数字温湿度传感器数据
        // {

        //     snprintf(payload_th, sizeof(payload_th),
        //              "{\"device_id\":\"smartroom\", \"temperature\":%.2f,\"humidity\":%.2f}", 
        //              temperature, humidity);    // 消息内容采用JSON格式

        //     int rc = MqttTaskPublish(ptopic_ht, payload_th);  // 发布消息
        //     if (rc != 0)                                // 检查是否成功发布消息
        //         printf("MQTT Publish failed!\r\n");
        //     else
        //         printf("MQTT Publish OK\r\n");
        // }

        // //定位
        // char payload_gps[512] = {0};                            // 消息内容
        // double west = 0.0;                           // 西经
        // double east = 0.0;                              // 东经
        // if (ReadGPS(&west, &east) == 0) //成功获取精度值
        // {

        //     snprintf(payload_gps, sizeof(payload_gps),
        //              "{\"device_id\":\"smartroom\", \"west\":%.2lf,\"east\":%.2lf}", 
        //              west, east);    // 消息内容采用JSON格式

        //     int rc = MqttTaskPublish(ptopic_gps, payload_gps);  // 发布消息
        //     if (rc != 0)                                // 检查是否成功发布消息
        //         printf("MQTT Publish failed!\r\n");
        //     else
        //         printf("MQTT Publish OK\r\n");
        // }
        
        // //水位
        // char payload_waterlevel[256] = {0};                            // 消息内容
        // int waterlevel=getwaterlevel();
        // if (waterlevel != 0) //成功获取水位传感器数据
        // {

        //     snprintf(payload_waterlevel, sizeof(payload_waterlevel),
        //              "{\"device_id\":\"pet\", \"waterlevel\":%d}", 
        //              waterlevel);    // 消息内容采用JSON格式

        //     int rc = MqttTaskPublish(ptopic_waterlevel, payload_waterlevel);  // 发布消息
        //     if (rc != 0)                                // 检查是否成功发布消息
        //         printf("MQTT Publish failed!\r\n");
        //     else
        //         printf("MQTT Publish OK\r\n");
        // }
        

        //三模加速度
        short x=0,y=0,z=0;
        char payload_mpu6050[256] = {0};                                  // 消息内容
        uint8_t res = MPU_Get_Accelerometer(&x,&y,&z);
        if(res != 0)
        {
            printf("failed\n");

        }
        float ax,ay,az;
        ax = x / 4096.0f;
        ay = y / 4096.0f;
        az = z / 4096.0f;
        printf("G值: X=%.2f, Y=%.2f, Z=%.2f\n",ax,ay,az);

        snprintf(payload_mpu6050, sizeof(payload_mpu6050),
                 "{\"device_id\":\"pet\", \"X\":%.2f,\"Y\":%.2f,\"Z\":%.2f}",
                 ax,ay,az);                                        // 获取传感器数据
        
        rc = MqttTaskPublish(ptopic_mpu6050, payload_mpu6050);                      // 发布消息
        if (rc != 0)                                                    // 检查是否成功发布消息
            printf("MQTT Publish failed!\r\n");                         // 输出发布失败信息
        else
            printf("MQTT Publish OK\r\n");                              // 输出发布成功信息


        osDelay(200);
    }
}



// 入口函数
static void Entry(void)
{


    // 定义线程属性
    osThreadAttr_t attr;
    attr.name = "petTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 10240;
    attr.priority = osPriorityNormal;

    // 创建线程(并将其加入活跃线程组中)
    if (osThreadNew(pet_demo, NULL, &attr) == NULL)
    {
        printf("Falied to create petTask!\n");
    }
}

// 运行入口函数
SYS_RUN(Entry);